#ifndef Button_h
#define Button_h

#include "OneButton.h"
#define BUTTON_PIN 6
#define BUZZER_PIN 40
#define POWEREN_PIN 7

void ButtonInit();
void Beep();
void ButtonStart();
void ButtonStop();
void Beep();
void BeepNokia();
void BeepPacMan();

OneButton button(BUTTON_PIN, true);

void ButtonInit()
{
    button.reset();
    pinMode(POWEREN_PIN, OUTPUT);
    pinMode(BUZZER_PIN, OUTPUT);
    digitalWrite(POWEREN_PIN, HIGH);
    BeepNokia();
    button.attachLongPressStart(ButtonStart);
}

void ButtonStart()
{
    BeepPacMan();
    digitalWrite(POWEREN_PIN, LOW);
}
void Beep()
{
    for (uint8_t i = 0; i < 255; i++)
    {
        digitalWrite(BUZZER_PIN, HIGH);
        delayMicroseconds(125);
        digitalWrite(BUZZER_PIN, LOW);
        delayMicroseconds(125);
    }
}

// ----- Beep Music----Do not care about this

#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988

#define REST 0

void BeepPacMan()
{
    int tempo = 105;

    int melody[] = {NOTE_DS5, 32, NOTE_E5, 32, NOTE_F5,  32, NOTE_F5, 32, NOTE_FS5, 32,
                    NOTE_G5,  32, NOTE_G5, 32, NOTE_GS5, 32, NOTE_A5, 16, NOTE_B5,  8};
    int notes = sizeof(melody) / sizeof(melody[0]) / 2;
    int wholenote = (60000 * 4) / tempo;
    int divider = 0, noteDuration = 0;
    for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2)
    {
        divider = melody[thisNote + 1];
        if (divider > 0)
        {
            noteDuration = (wholenote) / divider;
        }
        else if (divider < 0)
        {
            noteDuration = (wholenote) / abs(divider);
            noteDuration *= 1.5;
        }
        tone(BUZZER_PIN, melody[thisNote], noteDuration * 0.9);
        delay(noteDuration);
        noTone(BUZZER_PIN);
    }
}

void BeepNokia()
{
    int tempo = 180;
    int melody[] = {
        NOTE_E5, 8, NOTE_D5, 8, NOTE_FS4, 4, NOTE_GS4, 4, NOTE_CS5, 8, NOTE_B4, 8, NOTE_D4, 4,
        NOTE_E4, 4, NOTE_B4, 8, NOTE_A4,  8, NOTE_CS4, 4, NOTE_E4,  4, NOTE_A4, 2,
    };
    int notes = sizeof(melody) / sizeof(melody[0]) / 2;
    int wholenote = (60000 * 4) / tempo;
    int divider = 0, noteDuration = 0;
    for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2)
    {
        divider = melody[thisNote + 1];
        if (divider > 0)
        {
            noteDuration = (wholenote) / divider;
        }
        else if (divider < 0)
        {
            noteDuration = (wholenote) / abs(divider);
        }
        tone(BUZZER_PIN, melody[thisNote], noteDuration * 0.9);
        delay(noteDuration);
        noTone(BUZZER_PIN);
    }
}

#endif